package com.dddpeter.app.service;

import com.dddpeter.app.repository.ArticleMapper;
import com.dddpeter.app.repository.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.concurrent.atomic.AtomicLong;

/**
 * ID生成服务
 * 使用数据库确保ID的唯一性
 */
@Service
public class IdGeneratorService {
    
    @Autowired
    private ArticleMapper articleMapper;
    
    @Autowired
    private UserMapper userMapper;
    
    // 本地缓存，减少数据库查询
    private final AtomicLong lastArticleId = new AtomicLong(0);
    private final AtomicLong lastUserId = new AtomicLong(0);
    
    /**
     * 生成文章ID
     */
    @Transactional
    public synchronized Long generateArticleId() {
        // 获取当前数据库中的最大ID
        Long maxId = articleMapper.getMaxId();
        
        // 如果数据库为空或本地缓存小于数据库最大值，使用数据库最大值
        if (maxId == null || lastArticleId.get() < maxId) {
            lastArticleId.set(maxId != null ? maxId : 100000000000L);
        }
        
        // 生成下一个ID
        long nextId = lastArticleId.incrementAndGet();
        
        // 确保ID在12位数字范围内
        if (nextId < 100000000000L) {
            nextId = 100000000000L;
            lastArticleId.set(nextId);
        } else if (nextId > 999999999999L) {
            throw new RuntimeException("ID已达到最大值，无法生成新的ID");
        }
        
        return nextId;
    }
    
    /**
     * 生成用户ID
     */
    @Transactional
    public synchronized Long generateUserId() {
        // 获取当前数据库中的最大ID
        Long maxId = userMapper.getMaxId();
        
        // 如果数据库为空或本地缓存小于数据库最大值，使用数据库最大值
        if (maxId == null || lastUserId.get() < maxId) {
            lastUserId.set(maxId != null ? maxId : 100000000000L);
        }
        
        // 生成下一个ID
        long nextId = lastUserId.incrementAndGet();
        
        // 确保ID在12位数字范围内
        if (nextId < 100000000000L) {
            nextId = 100000000000L;
            lastUserId.set(nextId);
        } else if (nextId > 999999999999L) {
            throw new RuntimeException("ID已达到最大值，无法生成新的ID");
        }
        
        return nextId;
    }
    
    /**
     * 检查ID是否已存在
     */
    public boolean isArticleIdExists(Long id) {
        return articleMapper.selectById(id) != null;
    }
    
    /**
     * 检查用户ID是否已存在
     */
    public boolean isUserIdExists(Long id) {
        return userMapper.selectById(id) != null;
    }
}
